package student.aistar.day10.hashcodes;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class TestCourse {
    public static void main(String[] args) {
        Course c1 = new Course(1,"java");
        Course c2 = new Course(2,"mysql");
        Course c3 = new Course(3,"mysql");
        Course c4 = new Course(4,"mysql");
        Course c5 = new Course(5,"mysql");
        Course c6 = new Course(1,"oracle");
        System.out.println(c1 == c2);
        System.out.println(c1.equals(c6));

        //集合 - "容器". 比数组更加强大
        //集合 - 里面存储的数据是无序不可重复的
        //不能存储同一个对象
        Set<Course> sets = new HashSet<>();
        //1.当把某个对象放入到该容器之前, 先调用了该对象的hashCode方法, 得到一个哈希值
        //2.根据这个哈希值就可以被分配一个内存地址
        //3.如果这个哈希值在这之前没有出现过, 说明这个位置没有被占用, 那么就会直接将该对象放入到
        //  这个哈希值对应的容器的那个位置
        //4.如果这个哈希值在这之前出现过, 但是此时还不能说明这个对象和之前的哪个对象是同一个对象
        //  因为哈希值是通过哈希算法计算得到的, 可能回产生哈希冲突 - "哈希碰撞"
        //5.当哈希值一样的时候, 那么才会去调用equals方法, 如果equals方法仍然返回true, 那么才
        //  最终确定这个对象曾经出现过, 那么就拒绝添加
        sets.add(c1);
        sets.add(c2);
        sets.add(c3);
        sets.add(c4);
        sets.add(c5);
        sets.add(c6);

        for (Course set : sets) {
            System.out.println(set);
        }
        System.out.println(c1.getClass().getName() + "@" + Integer.toHexString(c1.hashCode()));
    }
}
